package br.com.controller.sala;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.controller.acesso.MBAcessoUsuario;
import br.com.data.hibernate.DiretorHibernateDAO;
import br.com.data.hibernate.SalaHibernateDAO;
import br.com.model.entidade.Diretor;
import br.com.model.entidade.Escola;
import br.com.model.entidade.Sala;
import br.com.model.entidade.Usuario;

@ManagedBean
@ViewScoped
public class MBSala extends AbstractMBean<Sala>{

	private Sala sala;
	private SalaHibernateDAO salaHibernateDAO;
	private DiretorHibernateDAO diretorHibernateDAO;
	private List<Sala> salas;
	private boolean editavel;
	private boolean visualizar;
	private Usuario user;
	private Escola escola; 
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBSala() {
		MBAcessoUsuario acesso = new MBAcessoUsuario();
		this.sala = new Sala();
		this.user = acesso.getUsuario();
		this.salaHibernateDAO = (SalaHibernateDAO) getBean("salaHibernateDAO");
		this.diretorHibernateDAO = (DiretorHibernateDAO) getBean("diretorHibernateDAO");
		Diretor d = new Diretor();
		try {
			d = this.diretorHibernateDAO.getByField(Diretor.class,"usuario", user).get(0);
		} catch (BDException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		this.escola = d.getEscola(); 
		
		this.editavel = false;
		this.visualizar = false;
		try {
			salas = salaHibernateDAO.getByField(Sala.class,"escola", escola);
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void irEditar(){
		this.editavel = true;
	}
	
	public void mudarVisualizar(){
		this.visualizar = !visualizar;
	}
	
	public void limpar(){
		this.sala = new Sala();
		this.editavel = false;
		this.visualizar = false;
	}
	
	public void cadastrar(){
		try {
			this.sala.setEscola(escola);
			serviceCadastro.salvar(sala);
			this.limpar();
			salas = salaHibernateDAO.getByField(Sala.class,"escola", escola);
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Sala cadastrada com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar sala!"));
			e.printStackTrace();
		}
	}
	
	public void editar(){
		try {
			serviceCadastro.atualizar(sala);
			this.limpar();
			salas = salaHibernateDAO.getByField(Sala.class,"escola", escola);
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Sala editada com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao editar sala!"));
			e.printStackTrace();
		}
	}
	
	public void remover(){
		try {
			serviceCadastro.atualizar(sala);
			this.limpar();
			salas = salaHibernateDAO.getByField(Sala.class,"escola", escola);
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Sala excluida com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir sala!"));
			e.printStackTrace();
		}
	}
	
	
	public Sala getSala() {
		return sala;
	}
	public void setSala(Sala sala) {
		this.sala = sala;
	}
	

	public List<Sala> getSalas() {
		return salas;
	}

	public void setSalas(List<Sala> salas) {
		this.salas = salas;
	}

	public boolean isEditavel() {
		return editavel;
	}

	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}

	public boolean isVisualizar() {
		return visualizar;
	}

	public void setVisualizar(boolean visualizar) {
		this.visualizar = visualizar;
	}
	
	
	
	
}
